package com.dycong.common.reflect.aop.annotation.After;


import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * Created by dycong on 2016/12/12.
 */
@Aspect
@Order(100)
@Component
public class GreetingAspectAfter {

    /**todo 任何通知方法的第一个参数都可以设为JoinPoint，但@Around为ProceedingJoinPoint*/

    //todo 后置Advice，在函数体执行之后 在 @AfterReturning 之前
    //todo 不管是否抛出异常都会执行，并且在抛出异常前，即函数结束时调用
   @After("@annotation(com.dycong.common.reflect.aop.annotation.After.After)")
    public void after(JoinPoint jp) {
       String method=jp.getSignature().getName();
        doSomeThingsAfter();
        System.out.println(method);
    }
    //todo 在函数返回之后，在@After之后，由于是返回之后，当然可以取得函数的返回值
    @AfterReturning(value = "@annotation(com.dycong.common.reflect.aop.annotation.After.AfterReturning)",returning = "result")
    public void AfterReturning(JoinPoint jp,Object result){
        String methodName = jp.getSignature().getName();
        System.out.println(methodName + " returning: "+result);
    }

    @AfterThrowing(value = "@annotation(com.dycong.common.reflect.aop.annotation.After.AfterThrowing)",throwing = "ex")
    public void AfterThrowing(JoinPoint jp,Throwable ex){
        String methodName = jp.getSignature().getName();
        System.out.println(methodName + " returning."+ex);
    }

    private void doSomeThingsAfter() {
        System.out.println("do somethings After Order");
    }
}
